/**
 * MRotateAnimation.java
 * classes: com.hymobile.common.animation.MRotateAnimation
 * 梁天刚 created at 2011-12-8 下午2:58:11
 */
package com.wzz.common.animation;

import android.view.animation.Transformation;

/**
 * com.hymobile.common.animation.MRotateAnimation
 * @author 梁天刚
 *
 * created at 2011-12-8 下午2:58:11
 */
public class MRotateAnimation extends MAnimation {

  private float mFromDegrees;
  private float mToDegrees;

  private int mPivotXType = ABSOLUTE;
  private int mPivotYType = ABSOLUTE;
  private float mPivotXValue = 0.0f;
  private float mPivotYValue = 0.0f;

  private float mPivotX;
  private float mPivotY;

  /**
   * Constructor to use when building a RotateAnimation from code.
   * Default pivotX/pivotY point is (0,0).
   * 
   * @param fromDegrees Rotation offset to apply at the start of the
   *        animation.
   * 
   * @param toDegrees Rotation offset to apply at the end of the animation.
   */
  public MRotateAnimation(float fromDegrees, float toDegrees) {
      mFromDegrees = fromDegrees;
      mToDegrees = toDegrees;
      mPivotX = 0.0f;
      mPivotY = 0.0f;
  }

  /**
   * Constructor to use when building a RotateAnimation from code
   * 
   * @param fromDegrees Rotation offset to apply at the start of the
   *        animation.
   * 
   * @param toDegrees Rotation offset to apply at the end of the animation.
   * 
   * @param pivotX The X coordinate of the point about which the object is
   *        being rotated, specified as an absolute number where 0 is the left
   *        edge.
   * @param pivotY The Y coordinate of the point about which the object is
   *        being rotated, specified as an absolute number where 0 is the top
   *        edge.
   */
  public MRotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) {
      mFromDegrees = fromDegrees;
      mToDegrees = toDegrees;

      mPivotXType = ABSOLUTE;
      mPivotYType = ABSOLUTE;
      mPivotXValue = pivotX;
      mPivotYValue = pivotY;
  }

  /**
   * Constructor to use when building a RotateAnimation from code
   * 
   * @param fromDegrees Rotation offset to apply at the start of the
   *        animation.
   * 
   * @param toDegrees Rotation offset to apply at the end of the animation.
   * 
   * @param pivotXType Specifies how pivotXValue should be interpreted. One of
   *        Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
   *        Animation.RELATIVE_TO_PARENT.
   * @param pivotXValue The X coordinate of the point about which the object
   *        is being rotated, specified as an absolute number where 0 is the
   *        left edge. This value can either be an absolute number if
   *        pivotXType is ABSOLUTE, or a percentage (where 1.0 is 100%)
   *        otherwise.
   * @param pivotYType Specifies how pivotYValue should be interpreted. One of
   *        Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF, or
   *        Animation.RELATIVE_TO_PARENT.
   * @param pivotYValue The Y coordinate of the point about which the object
   *        is being rotated, specified as an absolute number where 0 is the
   *        top edge. This value can either be an absolute number if
   *        pivotYType is ABSOLUTE, or a percentage (where 1.0 is 100%)
   *        otherwise.
   */
  public MRotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue,
          int pivotYType, float pivotYValue) {
      mFromDegrees = fromDegrees;
      mToDegrees = toDegrees;

      mPivotXValue = pivotXValue;
      mPivotXType = pivotXType;
      mPivotYValue = pivotYValue;
      mPivotYType = pivotYType;
  }

  @Override
  protected void applyTransformation(float interpolatedTime, Transformation t) {
      float degrees = mFromDegrees + ((mToDegrees - mFromDegrees) * interpolatedTime);

      if (mPivotX == 0.0f && mPivotY == 0.0f) {
          t.getMatrix().setRotate(degrees);
      } else {
          t.getMatrix().setRotate(degrees, mPivotX, mPivotY);
      }
  }

  @Override
  public void initialize(int width, int height, int parentWidth, int parentHeight) {
      super.initialize(width, height, parentWidth, parentHeight);
      mPivotX = resolveXSize(mPivotXType, mPivotXValue, width, parentWidth);
      mPivotY = resolveYSize(mPivotYType, mPivotYValue, height, parentHeight);
  }

}
